import { defineStore } from 'pinia'
import { login, logout, getUserInfo } from '@/api/auth'
import { ElMessage } from 'element-plus'

export const useUserStore = defineStore('user', {
  state: () => ({
    token: localStorage.getItem('token') || '',
    userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}')
  }),
  
  getters: {
    isLoggedIn: (state) => !!state.token,
    username: (state) => state.userInfo.username || '',
    role: (state) => state.userInfo.role || '',
    userId: (state) => state.userInfo.id || null,
    avatarUrl: (state) => state.userInfo.avatar || ''
  },
  
  actions: {
    // 用户登录
    async loginAction(userInfo) {
      try {
        const { username, password } = userInfo
        // 打印登录请求参数，但隐藏密码
        console.log('发送登录请求:', { username, password: '******' })
        
        const response = await login({ username, password })
        
        // 输出响应结构但过滤敏感信息
        console.log('登录响应状态码:', response.code)
        console.log('登录响应消息:', response.msg)
        
        // 验证响应格式 - 后端返回格式：{ code: 200, msg: "操作成功", data: { token: "xxx", userInfo: {...} } }
        if (response.code !== 200) {
          // 明确的错误处理
          const errorMsg = response.msg || '登录失败'
          console.error('登录失败:', errorMsg, '状态码:', response.code)
          return Promise.reject(new Error(errorMsg))
        }
        
        // 1. 提取并验证data对象
        const data = response.data
        if (!data) {
          console.error('登录响应格式错误: 缺少data字段', response)
          return Promise.reject(new Error('登录失败：服务器响应格式错误'))
        }
        
        // 2. 提取token
        const token = data.token
        if (!token) {
          console.error('登录响应格式错误: 缺少token字段', data)
          return Promise.reject(new Error('登录失败：无法获取认证令牌'))
        }
        
        // 3. 提取用户信息
        const userData = data.userInfo
        if (!userData || !userData.username) {
          console.warn('登录响应缺少用户信息或格式错误', data)
          // 继续执行但记录警告
        }
        
        // 4. 存储token (注意顺序：先内存后localStorage)
        this.token = token
        // 5. 存储用户信息
        this.userInfo = userData || {}
        
        // 6. 清除旧的存储避免冲突
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        
        // 7. 保存到本地存储
        localStorage.setItem('token', token)
        localStorage.setItem('userInfo', JSON.stringify(userData || {}))
        
        // 8. 验证存储结果
        const savedToken = localStorage.getItem('token')
        const savedUserInfoStr = localStorage.getItem('userInfo')
        
        // 9. 全面验证保存是否成功
        if (!savedToken || savedToken !== token) {
          console.error('token保存失败，本地存储中的token与预期不符')
          console.log('预期token:', token)
          console.log('实际保存的token:', savedToken)
          return Promise.reject(new Error('登录失败：安全验证保存异常'))
        }
        
        if (!savedUserInfoStr) {
          console.warn('用户信息保存可能失败，将使用内存中的数据')
        }
        
        console.log('登录成功，已保存认证信息')
        // 10. 返回清理后的对象，避免返回过多数据
        return Promise.resolve({ 
          success: true,
          token,
          userInfo: {
            id: userData?.id,
            username: userData?.username,
            role: userData?.role
          }
        })
      } catch (error) {
        console.error('登录请求异常:', error)
        return Promise.reject(new Error(error.message || '登录请求失败，请检查网络连接'))
      }
    },
    
    // 获取用户信息
    async getUserInfoAction() {
      try {
        const response = await getUserInfo()
        console.log('获取用户信息响应:', JSON.stringify(response))
        
        // 处理后端返回的标准格式
        if (response.code !== 200) {
          return Promise.reject(new Error(response.msg || '获取用户信息失败'))
        }
        
        // 从响应的data字段提取用户数据
        const userData = response.data
        if (!userData) {
          return Promise.reject(new Error('获取用户信息失败：响应数据为空'))
        }
        
        this.userInfo = userData
        localStorage.setItem('userInfo', JSON.stringify(userData))
        
        return Promise.resolve(userData)
      } catch (error) {
        return Promise.reject(error)
      }
    },
    
    // 用户登出
    async logoutAction() {
      try {
        // 先清除本地状态
        this.resetState()
        
        // 调用登出API
        const token = localStorage.getItem('token')
        if (token) {
          await logout()
          console.log('登出请求发送成功')
        }
        
        // 确保已清除所有存储
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        
        return Promise.resolve(true)
      } catch (error) {
        console.error('登出请求失败:', error)
        // 即使API调用失败，仍然清除本地状态
        this.resetState()
        return Promise.resolve(true) // 返回成功，因为本地状态已清除
      }
    },
    
    // 重置状态
    resetState() {
      this.token = ''
      this.userInfo = {}
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
    }
  }
}) 